gsk: Remember border node uniformity
authorTimm Bäder <mail@baedert.org>
Fri, 24 Jul 2020 13:59:45 +0000 (15:59 +0200)
committerTimm Bäder <mail@baedert.org>
Tue, 28 Jul 2020 03:34:11 +0000 (05:34 +0200)
Lots of border nodes have all the same width and the same color.
Renderers might be able to simplifty that, so keep an extra bit per
border node.

gsk/gl/gskglrenderer.c
gsk/gskrendernodeimpl.c
gsk/gskrendernodeprivate.h

index 81b9302f6da7b90e08287739abf4a09503b70c80..1b188fddfe0075b3895d5a439a6a776797ebcc9d 100644 (file)
@@ -735,12 +735,7 @@ render_border_node (GskGLRenderer   *self,
     float h;
   } sizes[4];
 
-  if (widths[0] == widths[1] &&
-      widths[0] == widths[2] &&
-      widths[0] == widths[3] &&
-      gdk_rgba_equal (&colors[0], &colors[1]) &&
-      gdk_rgba_equal (&colors[0], &colors[2]) &&
-      gdk_rgba_equal (&colors[0], &colors[3]))
+  if (gsk_border_node_get_uniform (node))
     {
       ops_set_program (builder, &self->programs->inset_shadow_program);
       ops_set_inset_shadow (builder, transform_rect (self, builder, rounded_outline),
index 05430bea8d64d4f1545ce3ca881f3601b30053a1..9879cdff12671f53836ad2595a8012ecc32a9b2d 100644 (file)
@@ -392,6 +392,7 @@ struct _GskBorderNode
 {
   GskRenderNode render_node;
 
+  bool uniform: 1;
   GskRoundedRect outline;
   float border_width[4];
   GdkRGBA border_color[4];
@@ -620,9 +621,9 @@ gsk_border_node_peek_colors (GskRenderNode *node)
  * Returns: (transfer full) (type GskBorderNode): A new #GskRenderNode
  */
 GskRenderNode *
-gsk_border_node_new (const GskRoundedRect     *outline,
-                     const float               border_width[4],
-                     const GdkRGBA             border_color[4])
+gsk_border_node_new (const GskRoundedRect *outline,
+                     const float           border_width[4],
+                     const GdkRGBA         border_color[4])
 {
   GskBorderNode *self;
   GskRenderNode *node;
@@ -638,11 +639,29 @@ gsk_border_node_new (const GskRoundedRect     *outline,
   memcpy (self->border_width, border_width, sizeof (self->border_width));
   memcpy (self->border_color, border_color, sizeof (self->border_color));
 
+  if (border_width[0] == border_width[1] &&
+      border_width[0] == border_width[2] &&
+      border_width[0] == border_width[3] &&
+      gdk_rgba_equal (&border_color[0], &border_color[1]) &&
+      gdk_rgba_equal (&border_color[0], &border_color[2]) &&
+      gdk_rgba_equal (&border_color[0], &border_color[3]))
+    self->uniform = TRUE;
+  else
+    self->uniform = FALSE;
+
+
   graphene_rect_init_from_rect (&node->bounds, &self->outline.bounds);
 
   return node;
 }
 
+/** Private */
+bool
+gsk_border_node_get_uniform (GskRenderNode *self)
+{
+  return  ((GskBorderNode *)self)->uniform;
+}
+
 /*** GSK_TEXTURE_NODE ***/
 
 struct _GskTextureNode
index c1b5809b4ecf0396fc5a7c44c0f843895fe6c8ab..d75a2c68b1bef3118bc9ea21f18823598cab1df5 100644 (file)
@@ -94,6 +94,8 @@ void            gsk_render_node_diff_impossible         (GskRenderNode
                                                          GskRenderNode               *node2,
                                                          cairo_region_t              *region);
 
+bool            gsk_border_node_get_uniform             (GskRenderNode               *self);
+
 G_END_DECLS
 
 #endif /* __GSK_RENDER_NODE_PRIVATE_H__ */